#ifndef __UART_BSP_H
#define __UART_BSP_H

#include "stdint.h"

#define UART_GETRX_BUFFER_LOG_EN    0
#define UART_INTHANDLE_LOG_EN 		0
#define UART_DMA_INT_LOG_EN   		0

#define USART0_RX_BUFFER_SIZE 32
#define USART1_RX_BUFFER_SIZE 32

#define UART_STOPBIT_0_5	0x1000
#define UART_STOPBIT_1		0x0000
#define UART_STOPBIT_1_5	0x2000
#define UART_STOPBIT_2		0x3000

typedef enum {
	UART_COM0,
	UART_COM1,
} UART_COM_LIST;

typedef enum {
	UART_PERR,
	UART_IDLE,
	UART_ERR_ORERR
} INTERRUPT_STATUS_E;

typedef enum {
	RESTART_DMA_ON_IDLE_EN,
	RESTART_DMA_ON_IDLE_UNEN,
	RESTART_DMA_ON_DMA_DONE_EN,
	RESTART_DMA_ON_DMA_DONE_UNEN
} UART_BEHAIVOR_CONFIG;

typedef void (* UartInterruptCbfunc)(void);

void UartDeInit(UART_COM_LIST com, uint32_t baud);
void UartSetBaud(UART_COM_LIST com, uint32_t baud);
void UartSetStopbit(UART_COM_LIST com, uint32_t stopbit);
uint32_t UartGetBaud(UART_COM_LIST com);
uint8_t *UartGetRxBuffer(UART_COM_LIST com);
uint16_t UartGetReceiveLen(UART_COM_LIST com);
void UartClearRxBuffer(UART_COM_LIST com);
void UartClearRxBufferSpecLen(UART_COM_LIST com, uint16_t len);

void UartWaitSendDone(UART_COM_LIST com);
uint8_t UartCheckSendDone(UART_COM_LIST com);
void UartIOToCore(UART_COM_LIST com, uint8_t rt);
void UartIOToPeripheral(UART_COM_LIST com, uint8_t rt);
void UartTxPullUp(UART_COM_LIST com);
void UartTxPullDown(UART_COM_LIST com);
void UartRxPullUp(UART_COM_LIST com);
void UartRxPullDown(UART_COM_LIST com);
void UartRxTxExchangeEnable(UART_COM_LIST com);
void UartRxTxExchangeDisable(UART_COM_LIST com);

void UartRawSendByte(UART_COM_LIST com, uint8_t data);
void UartRawSend(UART_COM_LIST com, const uint8_t *pData, uint16_t len);
void UartPuts(UART_COM_LIST com, const char *str);
void UartPrintf(UART_COM_LIST com, const char *format, ...);
void UartRawSendDMA(UART_COM_LIST com, uint32_t addr, uint16_t len);
void UartPutsDMA(UART_COM_LIST com, const char *str);
void UartPrintfDMA(UART_COM_LIST com, const char *format, ...);

void UartInterruptHandle(UART_COM_LIST com);
void UartDMAInterruptHandle(UART_COM_LIST com);

#endif
